#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_SIZE 100
#define INIT_SIZE 20

typedef int ElemType;

// 定义顺序表
typedef struct LNode
{
    ElemType *data;
    int length, maxSize;
} SeqList;

// 判断顺序表是否为空
bool Empty(SeqList L)
{
    return L.length == 0;
}

// 初始化顺序表
void InitList(SeqList &L, int len = INIT_SIZE, int max_size = MAX_SIZE)
{
    L.data = (ElemType *)malloc(sizeof(ElemType));
    L.length = len;
    L.maxSize = max_size;
    srand(time(NULL));
    for (int i = 0; i < len; i++)
    {
        L.data[i] = rand() % 100;
    }
}

// 返回链表长度
int Length(SeqList L)
{
    return L.length;
}

// 通过元素值获取顺序结点
int LocateElem(SeqList L, ElemType e)
{
    for (int i = 0; i < L.length; i++)
    {
        if (e == L.data[i])
        {
            return i + 1;
        }
    }
    return 0;
}

// 获取链表第i个结点
ElemType GetElem(SeqList L, int i)
{
    if (i < 0 || i > L.length)
    {
        return NULL;
    }
    return L.data[i - 1];
}

// 将元素e插入到链表第i个位置
bool ListInsert(SeqList &L, int i, ElemType e)
{
    if (i < 1 || i > L.length + 1)
    {
        return false;
    }
    if (L.length >= L.maxSize)
    {
        return false;
    }
    int j = L.length - 1;
    for (int j = L.length; j >= i; j--)
    {
        L.data[j] = L.data[j - 1];
    }
    L.data[i - 1] = e;
    L.length++;
    return true;
}

// 删除链表第i个元素，元素值赋值给e
bool ListDelete(SeqList &L, int i, ElemType &e)
{
    if (i < 1 || i > L.length)
    {
        return false;
    }
    e = L.data[i - 1];
    for (int j = i; j < L.length; j++)
    {
        L.data[j - 1] = L.data[j];
    }
    L.length--;
    return true;
}

// 打印链表
void PrintList(SeqList L)
{
    for (int i = 0; i < L.length; i++)
    {
        printf("%3d", L.data[i]);
    }
    printf("\n");
}

// 销毁链表
void DestoryList(SeqList &L)
{
    L.length = 0;
    L.data = NULL;
}

int main()
{
    SeqList L;
    InitList(L, 9);
    PrintList(L);
    ListInsert(L, 5, 0);
    PrintList(L);
    int index = LocateElem(L, 0);
    printf("index:%d", index);
    printf("\n");
    ElemType e;
    ListDelete(L, 5, e);
    printf("delete index:%d elem:%d", 5, e);
    printf("\n");
    int len = Length(L);
    printf("len:%d", len);
    printf("\n");
}